"בואו נעשה את הרשת מהירה יותר" — כך קרא Eric Higgins, וובמאסטר בגוגל, למאמר שפרסם בנושא ביצועים של php. מעניין מה הוא אמר?
אריק פותח במשפט אחד על פופולריות PHP ומוסיף הסתייגות קצרה שהתועלת מכל מה שיאמר יכול להשתנות בהתאם לגרסת php, השרת ומערכת ההפעלה ולאחר מכן ניגש ישר לעניין:
פרופילינג
profiling — הוא תהליך של בדיקת הקוד שבו נבדק זמן הפעולה של כל חלק בנפרד. כאן, ממליץ המחבר, לבצע בדיקות מהירות על הקוד ורק אחרי שבידכם תוצאות - להתחיל לשפר את הביצועים של המקומות הבעייתיים.
אופטימיזציה מוקדמת היא שורש כל רע — ולנסות לשפר את הקוד לפני שהוא נכתב ונבדק הוא סיבוך שכדאי להימנע ממנו.
עדכנו גרסה
קבוצת המפתחים של php משפרת את השפה מגרסה לגרסה ואם אתם עדיין עובדים עם הגרסה הלא עדכנית ביותר, הגיעה הזמן לשדרג או לצאת לפנסיה.
למרבה המזל עדכון גרסה בשרת wamp הביתי הוא תהליך יחסית פשוט.
השתמשו ב-caching
בקצרה: כל פעם שהסקריפט מופעל - הוא עושה את כל הפעולות שלו ומייצר html סופי. בהרבה מקרים ה-html הנוצר אינו משתנה בתדירות גבוה ולרוב קבוע - אפשר לשמור לזמן מה את ה-html התוצר ובכל גישה לסקריפט להחזיר את אותו התוצר השמור, במקום לבצע את כל הפעולות והחישובים שוב.
לדוגמה העמוד הראשי של האתר הזה נשאר זהה למשך כמה ימים בין פרסום לפרסום. במקום שהסקריפט כל פעם מחדש ייגש למסד, ישלוף את הנתונים, יכניס אותם לטבלה וכו' - אפשר להציג html מוכן שכבר נוצר על ידי הסקריפט ביום הפרסום ולא השתנה מאז.
השתמשו ב- memcached ובמערת תבניות עם caching מובנה כמו twig-project
שמרו את הפלט בבופר
buffer — במדעי המחשב חוצץ (buffer) הוא מקטע זיכרון המאחסן מידע באופן זמני בעת העברתו ממקום למקום.
כל פעם ש-php מעבירה משהו לפלט (אל שרת ה-apache) היא מבזבזת משאבים מסוימים. כדי לחסוך אותם אפשר לשמור את כל הפלט בזיכרון זמני ולבצעה את פעולת העברה רק פעם אחת.
בעמודים גדולים יכולה להיווצר השליה של טעינה איטית כיוון שנתונים לא מגיעים מהשרת ברגע שנוצרו אלה רק בסוף. אפשר להקטין את גודל ה-buffer והנתונים יעברו באופן שוטף יותר.
כל אלה ניתנים לשינוי בהגדרות של php.ini על ידי שינוי הערך של output_buffering
PHP Output Buffering
הימנעו מכתיבה getters ו-setters מיותרים
במחלקות מסוימות מעדיפים לא לתת גישה למשתנים פנימיים מחוץ לקוד של מחלקה ולכן כותבים מתודות שעבודתם היא לקרוא או לשנות ערך של משתנה:
class dog {
public $name = '';
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
public $name = '';
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
אם המשתנים מיועדים לשינוי מבחוץ בכל מקרה, אין סיבה לכתוב מתודות חסרות משמעוט אלו ועדיף לעבוד עם המשתנה ישירות. השיפור יכול להגיע ללמעלה מ-100%.
אל תצרו העתקים של משתנים
לפעמים בניסיון לעשות את הקוד נקי יותר מתכנתים יוצרים העתק של המשתנה עם שם קצר יותר כדי לעבוד איתו.
$description = strip_tags($_POST['description']);
echo $description;
echo $description;
קוד כזה גורם לשימוש בכמות זיכרון כפולה בסקריפט חוץ מההאטה.
echo strip_tags($_POST['description']);
אם אתם ממש רוצים לתת שם קצר יותר למשתנה השתמשו באופרטור & ליצירת הפניה.
שאילתות בתוך לולאה אסורות בהחלט
זוהי טעות נפוצה בקרב מתחילים.
צריך למחוק 50 שורות — לעשות לולאה שתפעיל 50 פעם מחיקה.
צריך להוסיף 10 רשומות — לעשות לולאה שתבצע 10 פעמים שאילתת הוספה.
foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
mysql_query($query);
}
$query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
mysql_query($query);
}
במקום להשתמש בלולאה כזו אפשר לחבר את כל הפעולות לשאילתה אחת בלבד.
$userData = array();
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $userData);
mysql_query($query);
ייתן:
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...
כל הטיפים בכתבה מסבירים טעיות נפוצות בעת הפיתוח שמדי פעם מחליקות
גם אצל מפתחים יותר מנוסים.
קישור למקור באנגלית: Let's make the web faster
כתבו בתגובות טיפים לייעול שאתם משתמשים בהם באתרכם
תגובות לכתבה:
תודה רבה.
אתה בטוח לגבי מה שרשמת ב"אל תצרו העתקים של משתנים" ?
כי אני משתמש בזה המון וזה מקל מאוד על חיי המתכנת,
אשמח לדעת ב-100% אם מתכנת טוב אמור לרשום $_POST['text'] במקום איזה משתנה פשוט $text ..
זה שזה מבזבז כפליים יותר זיכרון? אני בטוח במאה אחוז.
אם אתה רוצה לקצר את השם פשוט, תוכל להשתמש באופרטור &
text = & $_POST['text'] ; //x$
במקרה הזה במקום שאותם נתונים יופיעו פעמיים במקומות שונים בזיכרון של המחשב, יהיו לך שני משתנים שמצביעים לאותו מקום אחד בזיכרון.
נהדר, תודה אלכס.
תודה רבה.
השתמשתי באופ' & והמיקרוטיים יותר גבוה עכשיו..
לא ממש ברור איפה השתמשת באופרטור הזה ולמה, אבל זמן ככל שזמן הביצוע _נמוך יותר_ ככה טוב יותר.
אני יודע, כנראה שאנד לא באמת יעיל..
לגבי השמה כרפרנס - טעות בידיך.
אם תשים משתנה בשם אחר (בלי רפרנס מפורש) הוא יצביע למשתנה המקורי עד שתשנה את המשתנה החדש (ואז יווצר העתק כדי לא לפגוע במידע הקודם).
לכן אין שום בעיה לתת שם הגיוני למשתנה שרירותי.
זה בהחלט נכון. אני רק לא רואה במה זה שונה ממה שכתוב.